import settings from './settings'
import data from '@/mock'
import { addLogItem } from './log'

export async function translate(arr) {
  const points = []
  let temp = []
  for (let i = 0; i < arr.length; i++) {
    const item = arr[i]
    const point = new BMapGL.Point(item[0], item[1])
    temp.push(point)
    if (temp.length >= 10) {
      points.push(temp)
      temp = []
    }
  }
  temp.length > 0 && points.push(temp)
  return new Promise((resolve) => {
    transPoint(points, 0, [], resolve)
  })
}

function transPoint(points, i, result, resolve) {
  const convertor = new BMapGL.Convertor()
  if (i >= points.length) {
    resolve(result)
    return
  }
  convertor.translate(points[i], 6, 5, function (data) {
    if (data.status === 0) {
      result = result.concat(data.points)
      i++
      transPoint(points, i, result, resolve)
    }
  })
}

export function testEvents() {
  // 新增红方节点
  document.getElementById('addNewRed').addEventListener('click', () => {
    addMakernew(0, '无人机6', 118.821033, 32.034852)
  })
  // 新增蓝方节点
  document.getElementById('addNewBlue').addEventListener('click', () => {
    addMakernew(1, '基地车3', 118.82927, 32.035289)
  })
  // 删除红方节点3
  document.getElementById('delRed3').addEventListener('click', () => {
    removemyMaker('红子节点3')
  })
  // 红父节点开启扫描
  document.getElementById('openFanLayers').addEventListener('click', () => {
    setRedState(1, '红父节点', 1)
    // setRedState(1, '红父节点')
    setRedState(1, '红子节点1')
    setRedState(1, '红子节点2', 1)
    setRedState(1, '红子节点3')
  })
  // 蓝父节点开启扫描
  document.getElementById('openFanLayers2').addEventListener('click', () => {
    setBlueState(1, '蓝父节点')
    setBlueState(1, '蓝子节点1')
  })
  // 关闭扫描
  document.getElementById('closeFanLayers').addEventListener('click', () => {
    setRedState(0, '红父节点', 1)
    setRedState(0, '蓝父节点')
  })
  // 红父节点开启干扰
  document.getElementById('startLink').addEventListener('click', () => {
    //  name, startlng, starlat, endlng, endlat
    setRedFlyLine(1, ...data.red[0], ...data.blue[0])
  })
  // 红父节点开启通信
  document.getElementById('startLink1').addEventListener('click', () => {
    //  name, startlng, starlat, endlng, endlat
    setRedFlyLine(1, ...data.red[0], ...data.red[1])
  })
  // 红父节点关闭通信
  document.getElementById('closeLink').addEventListener('click', () => {
    //  name, startlng, starlat, endlng, endlat
    setRedFlyLine(0, ...data.red[0], ...data.red[1])
  })
  // 蓝父节点开启干扰
  document.getElementById('startLink2').addEventListener('click', () => {
    // startlng, starlat, endlng, endlat
    setBlueFlyLine(1, ...data.blue[0], ...data.red[1])
  })
  // 蓝父节点-蓝2 开启通信
  document.getElementById('startLink3').addEventListener('click', () => {
    // startlng, starlat, endlng, endlat
    setBlueFlyLine(1, ...data.blue[0], ...data.blue[1])
  })
  // 蓝父节点-蓝2 关闭通信
  document.getElementById('closeLink2').addEventListener('click', () => {
    // startlng, starlat, endlng, endlat
    setBlueFlyLine(0, ...data.blue[0], ...data.blue[1])
  })
  document.getElementById('move').addEventListener('click', () => {
    // 名称 目的坐标 移动类型 时间
    // move('蓝子节点1', [118.830414, 32.035203], 2, 3000)
    move('红子节点2', [118.830414, 32.035203], 0, 1000)
    move('红子节点3', [118.830614, 32.030603], 2, 1000)
  })
  document.getElementById('insertNet').addEventListener('click', () => {
    // 名称1 名称2
    insertNet('红子节点1', '红子节点2')
    insertNet('红父节点', '红子节点1')
    insertNet('蓝子节点1', '蓝子节点2')
  })
  document.getElementById('interfereNet').addEventListener('click', () => {
    // 名称1 名称2
    interfereNet('红子节点1', '红子节点2', 3000)
    interfereNet('红父节点', '红子节点1', 5000)
    interfereNet('蓝子节点1', '蓝子节点2')
  })
  document.getElementById('setCenter').addEventListener('click', () => {
    // 名称1 名称2
    setCenter(118.890692, 32.033499)
  })
}

/**
 * 根据两点获取曲线坐标点数组
 * @param Point 起点
 * @param Point 终点
 */
export function getCurveByTwoPoints(obj1, obj2, count, parts = 4) {
  if (!obj1 || !obj2) {
    return null
  }

  var B1 = function (x) {
    return 1 - 2 * x + x * x
  }
  var B2 = function (x) {
    return 2 * x - 2 * x * x
  }
  var B3 = function (x) {
    return x * x
  }

  var curveCoordinates = []

  var count = count || 40 // 曲线是由一些小的线段组成的，这个表示这个曲线所有到的折线的个数
  var isFuture = false
  var t, h, h2, lat3, lng3, j, t2 // t 为两点连线相对于横坐标的夹角
  var LnArray = []
  var i = 0
  var inc = 0

  if (typeof obj2 == 'undefined') {
    if (typeof curveCoordinates != 'undefined') {
      curveCoordinates = []
    }
    return
  }

  var lat1 = parseFloat(obj1.lat)
  var lat2 = parseFloat(obj2.lat)
  var lng1 = parseFloat(obj1.lng)
  var lng2 = parseFloat(obj2.lng)

  // 计算曲线角度的方法
  if (lng2 > lng1) {
    if (parseFloat(lng2 - lng1) > 180) {
      if (lng1 < 0) {
        lng1 = parseFloat(180 + 180 + lng1)
        lng2 = parseFloat(180 + 180 + lng2)
      }
    }
  }
  // 此时纠正了 lng1 lng2
  j = 0
  t2 = 0
  // 纬度相同
  if (lat2 == lat1) {
    t = 0
    h = lng1 - lng2
    // 经度相同
  } else if (lng2 == lng1) {
    t = Math.PI / 2
    h = lat1 - lat2
  } else {
    t = Math.atan((lat2 - lat1) / (lng2 - lng1))
    h = (lat2 - lat1) / Math.sin(t)
  }
  if (t2 == 0) {
    t2 = t + Math.PI / parts // 为曲线的初始斜率
  }
  h2 = h / 2 // 两点之间的距离
  lng3 = h2 * Math.cos(t2) + lng1
  lat3 = h2 * Math.sign(t2) + lat1

  for (i = 0; i < count + 1; i++) {
    var x = lng1 * B1(inc) + lng3 * B2(inc) + lng2 * B3(inc)
    var y = lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc)
    var lng1_src = obj1.lng
    var lng2_src = obj2.lng

    curveCoordinates.push([lng1_src < 0 && lng2_src > 0 ? x - 360 : x, y])
    inc = inc + 1 / count
  }
  return curveCoordinates
}

export function generateId(label1, label2) {
  return label1 > label2 ? `${label1}-${label2}` : `${label2}-${label1}`
}

export function printLog(title, info) {
  if (!settings.log) {
    return
  }
  const msg = new Date() + ' ' + title + ':' + info
  addLogItem(msg)
}

export function generateLog(type, name, op, isOn) {
  const campName = type === 0 ? '红方节点' : '蓝方节点'
  let label = ''
  if (op === 'add') {
    label = '新增'
  } else if (op === 'del') {
    label = '删除'
  } else if (op === 'setState') {
    label = isOn ? '打开了侦察/通信状态' : '关闭了侦察/通信状态'
  } else {
    label = op
  }
  return `${label}${campName}, 名称为：${name}: `
}